package com.boarsoft.flow.event;

import com.boarsoft.flow.core.SimpleFlow;
import com.boarsoft.flow.core.bean.BaseNode;

/**
 * 流程执行各类事件的监听处理
 * 
 * @author Mac_J
 *
 */
public interface SimpleFlowListener {
	/**
	 * 流程异常结束事件处理
	 * 
	 * @param flow
	 */
	void onError(SimpleFlow flow);

	/**
	 * 挂起事件处理
	 * 
	 * @param flow
	 */
	void onSuspend(SimpleFlow flow);

	/**
	 * 中断事件处理
	 * 
	 * @param flow
	 */
	void onStop(SimpleFlow flow);

	/**
	 * 超时事件处理
	 * 
	 * @param flow
	 */
	void onTimeout(SimpleFlow flow);

	/**
	 * 流程开始执行前触发
	 * 
	 * @param flow
	 * @throws Throwable
	 */
	void onBegin(SimpleFlow flow);

	/**
	 * 当流程遇到END标识退出时（正常完成时）触发<br>
	 * 可以在此处对流程返回结果进行判断，修改返回码等
	 * 
	 * @param flow
	 */
	void onEnd(SimpleFlow flow);

	/**
	 * 执行节点前事件
	 * 
	 * @param flow
	 * @param next
	 *            下一个节点，为空表示结束节点
	 */
	void onBeforeStep(SimpleFlow flow, Object data, BaseNode next);

	/**
	 * 节点执行后事件
	 * 
	 * @param flow
	 * @param flowEx
	 * @param next
	 *            下一个节点，为空表示结束节点
	 * @param stepEx
	 * @param time
	 */
	void onAfterStep(SimpleFlow flow, Object data, Throwable flowEx, String next, Throwable stepEx, long time);

	/**
	 * checkIn之后，调handler之前
	 * 
	 * @param flow
	 * @param data
	 * @param flowEx
	 * @param dd
	 */
	void onBeforeHandle(SimpleFlow flow, Object data, Throwable flowEx, Object dd);

	/**
	 * 调handler之后，checkOut之前
	 * 
	 * @param flow
	 * @param data
	 * @param flowEx
	 * @param checkInData
	 * @param dataCheckOut
	 * @param handleEx
	 */
	void onAfterHandle(SimpleFlow flow, Object data, Throwable flowEx, Object checkInData, Object dataCheckOut,
			Throwable handleEx);

	/**
	 * 调handler异常时触发
	 * 
	 * @param flow
	 * @param data
	 * @param flowEx
	 * @param checkInData
	 * @param handleEx
	 */
	void onFailHandle(SimpleFlow flow, Object data, Throwable flowEx, Object checkInData, Throwable handleEx);

	/**
	 * 执行步骤异常时的处理
	 * 
	 * @param flow
	 * @param data
	 * @param flowEx
	 * @param step
	 * @param stepEx
	 */
	void onFailStep(SimpleFlow flow, Object data, Throwable flowEx, String step, Throwable stepEx);
}
